Docker Dokerfile构建KingbaseV8R6镜像
1 制作kingbase 数据库软件包
找到kingbase 数据库已安装完成的服务器,打包数据库软件并下载。
cd $KINGBASE_HOME
tar -czvf kingbase.tar.gz Server/
Warning
后面要用到这个压缩包,如果想要制作其他版本的数据库软件包,方法同上。
2 创建工作目录
1、首先使用 docker 或 root 用户,创建一个 kes_build 工作目录:
mkdir ~/kes_build
2、上传KESV8R6 的 tar 包和授权文件至 mkdir ~/kes_build 目录。
ls ~/kes_build
//屏幕输出:
kingbase.tar.gz license.dat
3、创建Dockerfile 和 run.sh 文件。
touch Dockerfile docker-entrypoint.sh
3 编写 docker-entrypoint.sh 脚本
此脚本主要是在启动容器时,需要做的一些操作。
第一,此脚本会判断当前数据目录是否已经初始化了。然后回赋值一个全局变量 DATABASE_ALREADY_EXISTS 。此功能主要由 check_is_init 函数实现。
第二,此脚本根据 DATABASE_ALREADY_EXISTS 变量值,判断是否需要初始化数据库集簇。如果当前数据目录不存在,则开始初始化数据库集簇。此功能主要是由 db_init 函数实现。
第三、初始化完成之后,使用 sys_ctl 命令启动数据库。
所以这个脚本能够作为容器的启动脚本。保证每次数据库自动启动。
vi ~/kes_build/docker-entrypoint.sh
--------------------input------------------------------
#!/bin/sh
DB_PATH=/opt/kingbase # kingbase server Home environment
DATA_DIR=/opt/kingbase/data # kingbase KINGBASE_DATA environment
LOG_FILE=${DB_PATH}/logfile # kingbase log file
PASSWORD_FILE=${DB_PATH}/password # kingbase password file
rm -rf ${DATA_DIR}/.DS_Store
check_is_init() {
declare -g DATABASE_ALREADY_EXISTS
if [ -d "${DATA_DIR}" -a `ls -A ${DATA_DIR}|wc -w` -ne 0 ];then
DATABASE_ALREADY_EXISTS='true'
fi
}
db_init(){
mkdir -p ${DATA_DIR}
chown -R kingbase:kingbase ${DATA_DIR}
chmod 700 ${DATA_DIR}
echo ${SYSTEM_PWD-123456} > ${DB_PATH}/password
cd ${DB_PATH}/Server/bin/
#extraParams="--encoding=UTF8 --case-insensitive"
./initdb -U${SYSTEM_USER-SYSTEM} --pwfile=${DB_PATH}/password -E UTF8 -m ${DB_MODE-oracle} ${DATA_DIR} ${extraParams}
}
check_is_init
if [ -z "${DATABASE_ALREADY_EXISTS}" ];then
db_init
if [ $? -ne 0 ];then
echo "initdb failed"
exit 1
fi
fi
if [ -f "${DB_PATH}/Server/bin/license.dat" ];then
cp ${DB_PATH}/Server/bin/license.dat ${DB_PATH}/
fi
${DB_PATH}/Server/bin/sys_ctl -D ${DATA_DIR} -l ${LOG_FILE} start
sleep 15
exec tail -f ${LOG_FILE}
4 编写 Dockerfile 文件
FROM centos:7
RUN mkdir /opt/kingbase && groupadd kingbase && useradd -g kingbase -m -d /opt/kingbase -s /bin/bash kingbase
WORKDIR /opt/kingbase
ADD docker-entrypoint.sh ./
ADD license.dat ./
ADD kingbase.tar.gz ./
RUN chmod +x docker-entrypoint.sh
RUN chown -R kingbase:kingbase /opt/
ENV PATH /opt/kingbase/Server/bin:$PATH
ENV DB_VERSION V008R006C005B0023
USER kingbase
EXPOSE 54321
ENTRYPOINT ["/opt/kingbase/docker-entrypoint.sh"]
| 行数 | 说明 |
|---|---|
| 1 | 从centos:7镜像开始制作。 |
| 2 | 创建数据库 HOME 目录,添加kingbase用户。 |
| 3 | 指定工作目录,后面的操作将会在此目录中执行。 |
| 4 | 将容器启动时需要运行的脚本添加到镜像。 |
| 5 | 将license.dat 文件添加到镜像。 |
| 6 | 将数据库精简安装包添加到镜像,注意压缩包会被解压。 |
| 7 | 将赋予初始化脚本可执行权限。 |
| 8 | 更改容器内部的目录权限。 |
| 9 | 指定生效环境的变量,此步骤会添加到所有用户。 |
| 10 | 指定数据库版本环境变量。 |
| 11 | 默认使用kingbase用户执行初始化脚本。 |
| 12 | 开放端口 54321 。 |
| 13 | 指定初始化脚本的位置。 |
5 创建镜像
cd ~/kes_build
docker build --no-cache -t kingbase:v8r6 .
2、查看镜像
docker images list
更多命令语法请参考: docker images。
6 创建容器
6.1 无数据卷
docker run -d --name kingbase -p 54321:54321 -e SYSTEM_USER=system -e SYSTEM_PWD=kingbase kingbase:v8r6
查看当前数据库版本
docker ps -a
docker exec -it kingbase /bin/bash
ksql test system -c 'select version()'
6.2 有数据卷
1、创建数据卷。
mkdir -p /opt/kingbase/data
chown docker:docker /opt/kingbaes/data
2、创建容器并运行。
docker run -d --privileged --name kingbase -p 54321:54321 -e SYSTEM_USER=system -e SYSTEM_PWD=kingbase -v /opt/kingbase/data:/opt/kingbase/data kingbase:v8r6
由于数据库初始化时需要更改 data 目录权限,所以如果挂载外部数据卷时,需要使用 --privileged 选项。
3、查看数据库数据库版本。
docker ps -a
docker exec -it kingbase /bin/bash
ksql test system -c 'select version()'